home *** CD-ROM | disk | FTP | other *** search
Text File | 2008-05-21 | 40.8 KB | 1,436 lines |
- package mx.collections
- {
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import flash.system.ApplicationDomain;
- import flash.utils.Proxy;
- import flash.utils.flash_proxy;
- import flash.utils.getQualifiedClassName;
- import mx.collections.errors.CollectionViewError;
- import mx.collections.errors.ItemPendingError;
- import mx.core.IMXMLObject;
- import mx.core.mx_internal;
- import mx.events.CollectionEvent;
- import mx.events.CollectionEventKind;
- import mx.events.PropertyChangeEvent;
- import mx.resources.ResourceBundle;
- import mx.utils.ObjectUtil;
- import mx.utils.StringUtil;
-
- use namespace mx_internal;
- use namespace flash_proxy;
-
- public class ListCollectionView extends Proxy implements ICollectionView, IList, IMXMLObject
- {
- private static var resourceInvalidIndex:String;
-
- private static var resourceBookmarkNotFound:String;
-
- private static var resourceOutOfBounds:String;
-
- private static var resourceUnknownProperty:String;
-
- private static var resourceIncorrectAddition:String;
-
- private static var resourceItemNotFound:String;
-
- mx_internal static const VERSION:String = "2.0.1.0";
-
- private static var packageResources:ResourceBundle = ResourceBundle.getResourceBundle("collections",ApplicationDomain.currentDomain);
-
- loadResources();
-
- private var autoUpdateCounter:int;
-
- private var _list:IList;
-
- protected var localIndex:Array;
-
- private var _filterFunction:Function;
-
- private var pendingUpdates:Array;
-
- private var eventDispatcher:EventDispatcher;
-
- private var revision:int;
-
- private var _sort:Sort;
-
- public function ListCollectionView(param1:IList = null)
- {
- super();
- eventDispatcher = new EventDispatcher(this);
- this.list = param1;
- }
-
- private static function loadResources() : void
- {
- resourceOutOfBounds = packageResources.getString("outOfBounds");
- resourceInvalidIndex = packageResources.getString("invalidIndex");
- resourceUnknownProperty = packageResources.getString("unknownProperty");
- resourceIncorrectAddition = packageResources.getString("incorrectAddition");
- resourceItemNotFound = packageResources.getString("itemNotFound");
- resourceBookmarkNotFound = packageResources.getString("bookmarkNotFound");
- }
-
- public function set filterFunction(param1:Function) : void
- {
- _filterFunction = param1;
- dispatchEvent(new Event("filterFunctionChanged"));
- }
-
- public function removeEventListener(param1:String, param2:Function, param3:Boolean = false) : void
- {
- eventDispatcher.removeEventListener(param1,param2,param3);
- }
-
- private function replaceItemsInView(param1:Array, param2:int, param3:Boolean = true) : void
- {
- var _loc4_:int = 0;
- var _loc5_:Array = null;
- var _loc6_:Array = null;
- var _loc7_:int = 0;
- var _loc8_:PropertyChangeEvent = null;
- var _loc9_:CollectionEvent = null;
- if(localIndex)
- {
- _loc4_ = int(param1.length);
- _loc5_ = [];
- _loc6_ = [];
- _loc7_ = 0;
- while(_loc7_ < _loc4_)
- {
- _loc8_ = param1[_loc7_];
- _loc5_.push(_loc8_.oldValue);
- _loc6_.push(_loc8_.newValue);
- _loc7_++;
- }
- removeItemsFromView(_loc5_,param2,param3);
- addItemsToView(_loc6_,param2,param3);
- }
- else
- {
- _loc9_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc9_.kind = CollectionEventKind.REPLACE;
- _loc9_.location = param2;
- _loc9_.items = param1;
- dispatchEvent(_loc9_);
- }
- }
-
- public function willTrigger(param1:String) : Boolean
- {
- return eventDispatcher.willTrigger(param1);
- }
-
- private function handlePendingUpdates() : void
- {
- var _loc1_:Array = null;
- var _loc2_:CollectionEvent = null;
- var _loc3_:int = 0;
- var _loc4_:CollectionEvent = null;
- var _loc5_:int = 0;
- if(pendingUpdates)
- {
- _loc1_ = pendingUpdates;
- pendingUpdates = null;
- _loc3_ = 0;
- while(_loc3_ < _loc1_.length)
- {
- _loc4_ = _loc1_[_loc3_];
- if(_loc4_.kind == CollectionEventKind.UPDATE)
- {
- if(!_loc2_)
- {
- _loc2_ = _loc4_;
- }
- else
- {
- _loc5_ = 0;
- while(_loc5_ < _loc4_.items.length)
- {
- _loc2_.items.push(_loc4_.items[_loc5_]);
- _loc5_++;
- }
- }
- }
- else
- {
- listChangeHandler(_loc4_);
- }
- _loc3_++;
- }
- if(_loc2_)
- {
- listChangeHandler(_loc2_);
- }
- }
- }
-
- mx_internal function findItem(param1:Object, param2:String, param3:Boolean = false) : int
- {
- if(!sort)
- {
- throw new CollectionViewError(resourceItemNotFound);
- }
- if(localIndex.length == 0)
- {
- return param3 ? 0 : -1;
- }
- return sort.findItem(localIndex,param1,param2,param3);
- }
-
- override flash_proxy function hasProperty(param1:*) : Boolean
- {
- var index:int = 0;
- var n:Number = NaN;
- var name:* = param1;
- if(name is QName)
- {
- name = name.localName;
- }
- index = -1;
- try
- {
- n = parseInt(String(name));
- if(!isNaN(n))
- {
- index = int(n);
- }
- }
- catch(e:Error)
- {
- }
- if(index == -1)
- {
- return false;
- }
- return index >= 0 && index < length;
- }
-
- public function removeAll() : void
- {
- var _loc1_:int = 0;
- var _loc2_:int = 0;
- _loc1_ = length;
- if(_loc1_ > 0)
- {
- if(localIndex)
- {
- _loc2_ = _loc1_ - 1;
- while(_loc2_ >= 0)
- {
- removeItemAt(_loc2_);
- _loc2_--;
- }
- }
- else
- {
- list.removeAll();
- }
- }
- }
-
- [Bindable("collectionChange")]
- public function getItemAt(param1:int, param2:int = 0) : Object
- {
- if(param1 < 0 || param1 >= length)
- {
- throw new RangeError(StringUtil.substitute(resourceOutOfBounds,param1));
- }
- if(localIndex)
- {
- return localIndex[param1];
- }
- if(list)
- {
- return list.getItemAt(param1,param2);
- }
- return null;
- }
-
- private function moveItemInView(param1:Object, param2:Boolean = true, param3:Array = null) : void
- {
- var _loc4_:int = 0;
- var _loc5_:int = 0;
- var _loc6_:int = 0;
- var _loc7_:CollectionEvent = null;
- if(localIndex)
- {
- _loc4_ = -1;
- _loc5_ = 0;
- while(_loc5_ < localIndex.length)
- {
- if(localIndex[_loc5_] == param1)
- {
- _loc4_ = _loc5_;
- break;
- }
- _loc5_++;
- }
- if(_loc4_ > -1)
- {
- localIndex.splice(_loc4_,1);
- }
- _loc6_ = addItemsToView([param1],-1,false);
- if(param2)
- {
- _loc7_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc7_.items.push(param1);
- if(param3 && _loc6_ == _loc4_ && _loc6_ > -1)
- {
- param3.push(param1);
- return;
- }
- if(_loc6_ > -1 && _loc4_ > -1)
- {
- _loc7_.kind = CollectionEventKind.MOVE;
- _loc7_.location = _loc6_;
- _loc7_.oldLocation = _loc4_;
- }
- else if(_loc6_ > -1)
- {
- _loc7_.kind = CollectionEventKind.ADD;
- _loc7_.location = _loc6_;
- }
- else if(_loc4_ > -1)
- {
- _loc7_.kind = CollectionEventKind.REMOVE;
- _loc7_.location = _loc4_;
- }
- else
- {
- param2 = false;
- }
- if(param2)
- {
- dispatchEvent(_loc7_);
- }
- }
- }
- }
-
- override flash_proxy function nextName(param1:int) : String
- {
- return (param1 - 1).toString();
- }
-
- public function contains(param1:Object) : Boolean
- {
- return getItemIndex(param1) != -1;
- }
-
- public function itemUpdated(param1:Object, param2:Object = null, param3:Object = null, param4:Object = null) : void
- {
- list.itemUpdated(param1,param2,param3,param4);
- }
-
- private function removeItemsFromView(param1:Array, param2:int, param3:Boolean = true) : void
- {
- var _loc4_:Array = null;
- var _loc5_:int = 0;
- var _loc6_:int = 0;
- var _loc7_:Object = null;
- var _loc8_:int = 0;
- var _loc9_:CollectionEvent = null;
- _loc4_ = !!localIndex ? [] : param1;
- _loc5_ = param2;
- if(localIndex)
- {
- _loc6_ = 0;
- while(_loc6_ < param1.length)
- {
- _loc7_ = param1[_loc6_];
- _loc8_ = getItemIndex(_loc7_);
- if(_loc8_ > -1)
- {
- localIndex.splice(_loc8_,1);
- _loc4_.push(_loc7_);
- _loc5_ = _loc8_;
- }
- _loc6_++;
- }
- }
- if(param3 && _loc4_.length > 0)
- {
- _loc9_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc9_.kind = CollectionEventKind.REMOVE;
- _loc9_.location = !localIndex || _loc4_.length == 1 ? _loc5_ : -1;
- _loc9_.items = _loc4_;
- dispatchEvent(_loc9_);
- }
- }
-
- mx_internal function getBookmark(param1:int) : ListCollectionViewBookmark
- {
- var value:Object = null;
- var index:int = param1;
- if(index < 0 || index > length)
- {
- throw new CollectionViewError(StringUtil.substitute(resourceInvalidIndex,index));
- }
- try
- {
- value = getItemAt(index);
- }
- catch(e:Error)
- {
- value = null;
- }
- return new ListCollectionViewBookmark(value,this,revision,index);
- }
-
- [Bindable("sortChanged")]
- public function get sort() : Sort
- {
- return _sort;
- }
-
- public function addItemAt(param1:Object, param2:int) : void
- {
- var _loc3_:int = 0;
- if(param2 < 0 || !list || param2 > length)
- {
- throw new RangeError(StringUtil.substitute(resourceOutOfBounds,param2));
- }
- _loc3_ = param2;
- if(Boolean(localIndex) && Boolean(sort))
- {
- _loc3_ = list.length;
- }
- list.addItemAt(param1,_loc3_);
- }
-
- private function handlePropertyChangeEvents(param1:Array) : void
- {
- var _loc2_:Array = null;
- var _loc3_:Array = null;
- var _loc4_:Object = null;
- var _loc5_:int = 0;
- var _loc6_:Array = null;
- var _loc7_:int = 0;
- var _loc8_:PropertyChangeEvent = null;
- var _loc9_:Object = null;
- var _loc10_:* = false;
- var _loc11_:int = 0;
- var _loc12_:int = 0;
- var _loc13_:CollectionEvent = null;
- _loc2_ = param1;
- if(Boolean(sort) || filterFunction != null)
- {
- _loc3_ = [];
- _loc5_ = 0;
- while(_loc5_ < param1.length)
- {
- _loc8_ = param1[_loc5_];
- if(_loc8_.target)
- {
- _loc9_ = _loc8_.target;
- _loc10_ = _loc8_.target != _loc8_.source;
- }
- else
- {
- _loc9_ = _loc8_.source;
- _loc10_ = false;
- }
- _loc11_ = 0;
- while(_loc11_ < _loc3_.length)
- {
- if(_loc3_[_loc11_].item == _loc9_)
- {
- break;
- }
- _loc11_++;
- }
- if(_loc11_ < _loc3_.length)
- {
- _loc4_ = _loc3_[_loc11_];
- }
- else
- {
- _loc4_ = {
- "item":_loc9_,
- "move":_loc10_,
- "event":_loc8_
- };
- _loc3_.push(_loc4_);
- }
- _loc4_.move = _loc4_.move || filterFunction || !_loc8_.property || sort && sort.propertyAffectsSort(String(_loc8_.property));
- _loc5_++;
- }
- _loc2_ = [];
- _loc5_ = 0;
- while(_loc5_ < _loc3_.length)
- {
- _loc4_ = _loc3_[_loc5_];
- if(_loc4_.move)
- {
- moveItemInView(_loc4_.item,_loc4_.item,_loc2_);
- }
- else
- {
- _loc2_.push(_loc4_.item);
- }
- _loc5_++;
- }
- _loc6_ = new Array();
- _loc7_ = 0;
- while(_loc7_ < _loc2_.length)
- {
- _loc12_ = 0;
- while(_loc12_ < _loc3_.length)
- {
- if(_loc2_[_loc7_] == _loc3_[_loc12_].item)
- {
- _loc6_.push(_loc3_[_loc12_].event);
- }
- _loc12_++;
- }
- _loc7_++;
- }
- _loc2_ = _loc6_;
- }
- if(_loc2_.length > 0)
- {
- _loc13_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc13_.kind = CollectionEventKind.UPDATE;
- _loc13_.items = _loc2_;
- dispatchEvent(_loc13_);
- }
- }
-
- [Bindable("listChanged")]
- public function get list() : IList
- {
- return _list;
- }
-
- private function populateLocalIndex() : void
- {
- if(list)
- {
- localIndex = list.toArray();
- }
- else
- {
- localIndex = [];
- }
- }
-
- public function set sort(param1:Sort) : void
- {
- _sort = param1;
- dispatchEvent(new Event("sortChanged"));
- }
-
- override flash_proxy function nextValue(param1:int) : *
- {
- return getItemAt(param1 - 1);
- }
-
- private function addItemsToView(param1:Array, param2:int, param3:Boolean = true) : int
- {
- var _loc4_:Array = null;
- var _loc5_:int = 0;
- var _loc6_:int = 0;
- var _loc7_:int = 0;
- var _loc8_:Object = null;
- var _loc9_:CollectionEvent = null;
- _loc4_ = !!localIndex ? [] : param1;
- _loc5_ = param2;
- if(localIndex)
- {
- _loc6_ = param2;
- _loc7_ = 0;
- while(_loc7_ < param1.length)
- {
- _loc8_ = param1[_loc7_];
- if(filterFunction == null || filterFunction(_loc8_))
- {
- if(sort)
- {
- _loc5_ = _loc6_ = mx_internal::findItem(_loc8_,Sort.ANY_INDEX_MODE,true);
- }
- if(sort && sort.unique && sort.compareFunction(_loc8_,localIndex[_loc6_]) == 0)
- {
- throw new CollectionViewError(resourceIncorrectAddition);
- }
- localIndex.splice(_loc6_++,0,_loc8_);
- _loc4_.push(_loc8_);
- }
- _loc7_++;
- }
- }
- if(Boolean(localIndex) && _loc4_.length > 1)
- {
- _loc5_ = -1;
- }
- if(param3 && _loc4_.length > 0)
- {
- _loc9_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc9_.kind = CollectionEventKind.ADD;
- _loc9_.location = _loc5_;
- _loc9_.items = _loc4_;
- dispatchEvent(_loc9_);
- }
- return _loc5_;
- }
-
- public function dispatchEvent(param1:Event) : Boolean
- {
- return eventDispatcher.dispatchEvent(param1);
- }
-
- public function getItemIndex(param1:Object) : int
- {
- var _loc2_:int = 0;
- var _loc3_:int = 0;
- var _loc4_:int = 0;
- var _loc5_:int = 0;
- if(sort)
- {
- _loc3_ = sort.findItem(localIndex,param1,Sort.FIRST_INDEX_MODE);
- if(_loc3_ == -1)
- {
- return -1;
- }
- _loc4_ = sort.findItem(localIndex,param1,Sort.LAST_INDEX_MODE);
- _loc2_ = _loc3_;
- while(_loc2_ <= _loc4_)
- {
- if(localIndex[_loc2_] == param1)
- {
- return _loc2_;
- }
- _loc2_++;
- }
- return -1;
- }
- if(filterFunction != null)
- {
- _loc5_ = int(localIndex.length);
- _loc2_ = 0;
- while(_loc2_ < _loc5_)
- {
- if(localIndex[_loc2_] == param1)
- {
- return _loc2_;
- }
- _loc2_++;
- }
- return -1;
- }
- return list.getItemIndex(param1);
- }
-
- public function enableAutoUpdate() : void
- {
- if(autoUpdateCounter > 0)
- {
- --autoUpdateCounter;
- if(autoUpdateCounter == 0)
- {
- handlePendingUpdates();
- }
- }
- }
-
- override flash_proxy function getProperty(param1:*) : *
- {
- var index:int = 0;
- var n:Number = NaN;
- var name:* = param1;
- if(name is QName)
- {
- name = name.localName;
- }
- index = -1;
- try
- {
- n = parseInt(String(name));
- if(!isNaN(n))
- {
- index = int(n);
- }
- }
- catch(e:Error)
- {
- }
- if(index == -1)
- {
- throw new Error(StringUtil.substitute(resourceUnknownProperty,name));
- }
- return getItemAt(index);
- }
-
- mx_internal function getBookmarkIndex(param1:CursorBookmark) : int
- {
- var _loc2_:ListCollectionViewBookmark = null;
- if(!(param1 is ListCollectionViewBookmark) || ListCollectionViewBookmark(param1).mx_internal::view != this)
- {
- throw new CollectionViewError(resourceBookmarkNotFound);
- }
- _loc2_ = ListCollectionViewBookmark(param1);
- if(_loc2_.mx_internal::viewRevision != revision)
- {
- if(_loc2_.mx_internal::index < 0 || _loc2_.mx_internal::index >= length || getItemAt(_loc2_.mx_internal::index) != _loc2_.value)
- {
- _loc2_.mx_internal::index = getItemIndex(_loc2_.value);
- }
- _loc2_.mx_internal::viewRevision = revision;
- }
- return _loc2_.mx_internal::index;
- }
-
- public function addEventListener(param1:String, param2:Function, param3:Boolean = false, param4:int = 0, param5:Boolean = false) : void
- {
- eventDispatcher.addEventListener(param1,param2,param3,param4,param5);
- }
-
- public function removeItemAt(param1:int) : Object
- {
- var _loc2_:int = 0;
- var _loc3_:Object = null;
- if(param1 < 0 || param1 >= length)
- {
- throw new RangeError(StringUtil.substitute(resourceOutOfBounds,param1));
- }
- _loc2_ = param1;
- if(localIndex)
- {
- _loc3_ = localIndex[param1];
- _loc2_ = list.getItemIndex(_loc3_);
- }
- return list.removeItemAt(_loc2_);
- }
-
- override flash_proxy function callProperty(param1:*, ... rest) : *
- {
- return null;
- }
-
- public function initialized(param1:Object, param2:String) : void
- {
- refresh();
- }
-
- public function setItemAt(param1:Object, param2:int) : Object
- {
- var _loc3_:int = 0;
- var _loc4_:Object = null;
- if(param2 < 0 || !list || param2 >= length)
- {
- throw new RangeError(StringUtil.substitute(resourceOutOfBounds,param2));
- }
- _loc3_ = param2;
- if(localIndex)
- {
- if(param2 > localIndex.length)
- {
- _loc3_ = list.length;
- }
- else
- {
- _loc4_ = localIndex[param2];
- _loc3_ = list.getItemIndex(_loc4_);
- }
- }
- return list.setItemAt(param1,_loc3_);
- }
-
- mx_internal function reset() : void
- {
- var _loc1_:CollectionEvent = null;
- internalRefresh(false);
- _loc1_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- _loc1_.kind = CollectionEventKind.RESET;
- dispatchEvent(_loc1_);
- }
-
- override flash_proxy function setProperty(param1:*, param2:*) : void
- {
- var index:int = 0;
- var n:Number = NaN;
- var name:* = param1;
- var value:* = param2;
- if(name is QName)
- {
- name = name.localName;
- }
- index = -1;
- try
- {
- n = parseInt(String(name));
- if(!isNaN(n))
- {
- index = int(n);
- }
- }
- catch(e:Error)
- {
- }
- if(index == -1)
- {
- throw new Error(StringUtil.substitute(resourceUnknownProperty,name));
- }
- setItemAt(value,index);
- }
-
- override flash_proxy function nextNameIndex(param1:int) : int
- {
- return param1 < length ? param1 + 1 : 0;
- }
-
- public function set list(param1:IList) : void
- {
- var _loc2_:* = false;
- var _loc3_:* = false;
- if(_list != param1)
- {
- if(_list)
- {
- _list.removeEventListener(CollectionEvent.COLLECTION_CHANGE,listChangeHandler);
- _loc2_ = _list.length > 0;
- }
- _list = param1;
- if(_list)
- {
- _list.addEventListener(CollectionEvent.COLLECTION_CHANGE,listChangeHandler,false,0,true);
- _loc3_ = _list.length > 0;
- }
- if(_loc2_ || _loc3_)
- {
- mx_internal::reset();
- }
- dispatchEvent(new Event("listChanged"));
- }
- }
-
- public function toArray() : Array
- {
- var _loc1_:Array = null;
- if(localIndex)
- {
- _loc1_ = localIndex.concat();
- }
- else
- {
- _loc1_ = list.toArray();
- }
- return _loc1_;
- }
-
- private function internalRefresh(param1:Boolean) : Boolean
- {
- var tmp:Array = null;
- var len:int = 0;
- var i:int = 0;
- var item:Object = null;
- var refreshEvent:CollectionEvent = null;
- var dispatch:Boolean = param1;
- if(Boolean(sort) || filterFunction != null)
- {
- try
- {
- populateLocalIndex();
- }
- catch(pending:ItemPendingError)
- {
- pending.addResponder(new ItemResponder(function(param1:Object, param2:Object = null):void
- {
- internalRefresh(dispatch);
- },function(param1:Object, param2:Object = null):void
- {
- }));
- return false;
- }
- if(filterFunction != null)
- {
- tmp = [];
- len = int(localIndex.length);
- i = 0;
- while(i < len)
- {
- item = localIndex[i];
- if(filterFunction(item))
- {
- tmp.push(item);
- }
- i++;
- }
- localIndex = tmp;
- }
- if(sort)
- {
- sort.sort(localIndex);
- dispatch = true;
- }
- }
- else if(localIndex)
- {
- localIndex = null;
- }
- ++revision;
- pendingUpdates = null;
- if(dispatch)
- {
- refreshEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
- refreshEvent.kind = CollectionEventKind.REFRESH;
- dispatchEvent(refreshEvent);
- }
- return true;
- }
-
- public function disableAutoUpdate() : void
- {
- ++autoUpdateCounter;
- }
-
- public function refresh() : Boolean
- {
- return internalRefresh(true);
- }
-
- public function addItem(param1:Object) : void
- {
- addItemAt(param1,length);
- }
-
- [Bindable("filterFunctionChanged")]
- public function get filterFunction() : Function
- {
- return _filterFunction;
- }
-
- public function createCursor() : IViewCursor
- {
- return new ListCollectionViewCursor(this);
- }
-
- public function hasEventListener(param1:String) : Boolean
- {
- return eventDispatcher.hasEventListener(param1);
- }
-
- [Bindable("collectionChange")]
- public function get length() : int
- {
- if(localIndex)
- {
- return localIndex.length;
- }
- if(list)
- {
- return list.length;
- }
- return 0;
- }
-
- public function toString() : String
- {
- if(localIndex)
- {
- return ObjectUtil.toString(localIndex);
- }
- if(Boolean(list) && Boolean(Object(list).toString))
- {
- return Object(list).toString();
- }
- return getQualifiedClassName(this);
- }
-
- private function listChangeHandler(param1:CollectionEvent) : void
- {
- if(autoUpdateCounter > 0)
- {
- if(!pendingUpdates)
- {
- pendingUpdates = [];
- }
- pendingUpdates.push(param1);
- }
- else
- {
- switch(param1.kind)
- {
- case CollectionEventKind.ADD:
- addItemsToView(param1.items,param1.location);
- break;
- case CollectionEventKind.RESET:
- mx_internal::reset();
- break;
- case CollectionEventKind.REMOVE:
- removeItemsFromView(param1.items,param1.location);
- break;
- case CollectionEventKind.REPLACE:
- replaceItemsInView(param1.items,param1.location);
- break;
- case CollectionEventKind.UPDATE:
- handlePropertyChangeEvents(param1.items);
- break;
- default:
- dispatchEvent(param1);
- }
- }
- }
- }
- }
-
- import flash.events.EventDispatcher;
- import flash.system.ApplicationDomain;
- import mx.collections.errors.CollectionViewError;
- import mx.collections.errors.CursorError;
- import mx.collections.errors.ItemPendingError;
- import mx.collections.errors.SortError;
- import mx.core.mx_internal;
- import mx.events.CollectionEvent;
- import mx.events.CollectionEventKind;
- import mx.events.FlexEvent;
- import mx.resources.ResourceBundle;
-
- use namespace mx_internal;
-
- class ListCollectionViewBookmark extends CursorBookmark
- {
- mx_internal var viewRevision:int;
-
- mx_internal var view:ListCollectionView;
-
- mx_internal var index:int;
-
- public function ListCollectionViewBookmark(param1:Object, param2:ListCollectionView, param3:int, param4:int)
- {
- super(param1);
- this.mx_internal::view = param2;
- this.mx_internal::viewRevision = param3;
- this.mx_internal::index = param4;
- }
-
- override public function getViewIndex() : int
- {
- return mx_internal::view.mx_internal::getBookmarkIndex(this);
- }
- }
-
- class ListCollectionViewCursor extends EventDispatcher implements IViewCursor
- {
- private static var resourceInvalidInsert:String;
-
- private static var resourceInvalidRemove:String;
-
- private static var resourceInvalidBookmark:String;
-
- private static var resourceBookmarkInvalid:String;
-
- private static var resourceInvalidCursor:String;
-
- private static const BEFORE_FIRST_INDEX:int = -1;
-
- private static const AFTER_LAST_INDEX:int = -2;
-
- private static var packageResources:ResourceBundle = ResourceBundle.getResourceBundle("collections",ApplicationDomain.currentDomain);
-
- loadResources();
-
- private var _view:ListCollectionView;
-
- private var currentValue:Object;
-
- private var currentIndex:int;
-
- private var invalid:Boolean;
-
- public function ListCollectionViewCursor(param1:ListCollectionView)
- {
- var view:ListCollectionView = param1;
- super();
- _view = view;
- _view.addEventListener(CollectionEvent.COLLECTION_CHANGE,collectionEventHandler,false,0,true);
- currentIndex = view.length > 0 ? 0 : int(AFTER_LAST_INDEX);
- if(currentIndex == 0)
- {
- try
- {
- setCurrent(view.getItemAt(0),false);
- }
- catch(e:ItemPendingError)
- {
- currentIndex = BEFORE_FIRST_INDEX;
- setCurrent(null,false);
- }
- }
- }
-
- private static function loadResources() : void
- {
- resourceInvalidInsert = packageResources.getString("invalidInsert");
- resourceInvalidRemove = packageResources.getString("invalidRemove");
- resourceBookmarkInvalid = packageResources.getString("bookmarkInvalid");
- resourceInvalidBookmark = packageResources.getString("invalidBookmark");
- resourceInvalidCursor = packageResources.getString("invalidCursor");
- }
-
- public function movePrevious() : Boolean
- {
- var _loc1_:int = 0;
- if(beforeFirst)
- {
- return false;
- }
- _loc1_ = !!afterLast ? int(view.length - 1) : int(currentIndex - 1);
- if(_loc1_ == -1)
- {
- _loc1_ = int(BEFORE_FIRST_INDEX);
- setCurrent(null);
- }
- else
- {
- setCurrent(ListCollectionView(view).getItemAt(_loc1_));
- }
- currentIndex = _loc1_;
- return !beforeFirst;
- }
-
- [Bindable("cursorUpdate")]
- public function get beforeFirst() : Boolean
- {
- checkValid();
- return currentIndex == BEFORE_FIRST_INDEX || view.length == 0;
- }
-
- public function remove() : Object
- {
- var oldIndex:int = 0;
- var removed:Object = null;
- if(Boolean(beforeFirst) || Boolean(afterLast))
- {
- throw new CursorError(resourceInvalidRemove);
- }
- oldIndex = int(currentIndex);
- ++currentIndex;
- if(currentIndex >= view.length)
- {
- currentIndex = AFTER_LAST_INDEX;
- setCurrent(null);
- }
- else
- {
- try
- {
- setCurrent(ListCollectionView(view).getItemAt(currentIndex));
- }
- catch(e:ItemPendingError)
- {
- setCurrent(null,false);
- ListCollectionView(view).removeItemAt(oldIndex);
- throw e;
- }
- }
- removed = ListCollectionView(view).removeItemAt(oldIndex);
- return removed;
- }
-
- private function collectionEventHandler(param1:CollectionEvent) : void
- {
- var event:CollectionEvent = param1;
- switch(event.kind)
- {
- case CollectionEventKind.ADD:
- if(event.location <= currentIndex)
- {
- currentIndex += event.items.length;
- }
- break;
- case CollectionEventKind.REMOVE:
- if(event.location < currentIndex)
- {
- currentIndex -= event.items.length;
- }
- else if(event.location == currentIndex)
- {
- if(currentIndex < view.length)
- {
- try
- {
- setCurrent(ListCollectionView(view).getItemAt(currentIndex));
- }
- catch(error:ItemPendingError)
- {
- setCurrent(null,false);
- }
- }
- else
- {
- currentIndex = AFTER_LAST_INDEX;
- setCurrent(null);
- }
- }
- break;
- case CollectionEventKind.MOVE:
- if(event.oldLocation == currentIndex)
- {
- currentIndex = event.location;
- }
- else
- {
- if(event.oldLocation < currentIndex)
- {
- currentIndex -= event.items.length;
- }
- if(event.location <= currentIndex)
- {
- currentIndex += event.items.length;
- }
- }
- break;
- case CollectionEventKind.REFRESH:
- if(!(Boolean(beforeFirst) || Boolean(afterLast)))
- {
- currentIndex = ListCollectionView(view).getItemIndex(currentValue);
- if(currentIndex == -1)
- {
- setCurrent(null);
- }
- }
- break;
- case CollectionEventKind.REPLACE:
- if(event.location == currentIndex)
- {
- try
- {
- setCurrent(ListCollectionView(view).getItemAt(currentIndex));
- }
- catch(error:ItemPendingError)
- {
- setCurrent(null,false);
- }
- }
- break;
- case CollectionEventKind.RESET:
- currentIndex = BEFORE_FIRST_INDEX;
- setCurrent(null);
- }
- }
-
- [Bindable("cursorUpdate")]
- public function get current() : Object
- {
- checkValid();
- return currentValue;
- }
-
- [Bindable("cursorUpdate")]
- public function get afterLast() : Boolean
- {
- checkValid();
- return currentIndex == AFTER_LAST_INDEX || view.length == 0;
- }
-
- public function findFirst(param1:Object) : Boolean
- {
- var lcView:ListCollectionView = null;
- var index:int = 0;
- var values:Object = param1;
- checkValid();
- lcView = ListCollectionView(view);
- try
- {
- index = lcView.mx_internal::findItem(values,Sort.FIRST_INDEX_MODE);
- }
- catch(sortError:SortError)
- {
- throw new CursorError(sortError.message);
- }
- if(index > -1)
- {
- currentIndex = index;
- setCurrent(lcView.getItemAt(currentIndex));
- }
- return index > -1;
- }
-
- public function get view() : ICollectionView
- {
- checkValid();
- return _view;
- }
-
- private function setCurrent(param1:Object, param2:Boolean = true) : void
- {
- currentValue = param1;
- if(param2)
- {
- dispatchEvent(new FlexEvent(FlexEvent.CURSOR_UPDATE));
- }
- }
-
- public function insert(param1:Object) : void
- {
- var _loc2_:int = 0;
- if(afterLast)
- {
- _loc2_ = int(view.length);
- }
- else if(beforeFirst)
- {
- if(view.length > 0)
- {
- throw new CursorError(resourceInvalidInsert);
- }
- _loc2_ = 0;
- }
- else
- {
- _loc2_ = int(currentIndex);
- }
- ListCollectionView(view).addItemAt(param1,_loc2_);
- }
-
- [Bindable("cursorUpdate")]
- public function get bookmark() : CursorBookmark
- {
- checkValid();
- if(view.length == 0 || Boolean(beforeFirst))
- {
- return CursorBookmark.FIRST;
- }
- if(afterLast)
- {
- return CursorBookmark.LAST;
- }
- return ListCollectionView(view).mx_internal::getBookmark(currentIndex);
- }
-
- private function checkValid() : void
- {
- if(invalid)
- {
- throw new CursorError(resourceInvalidCursor);
- }
- }
-
- public function moveNext() : Boolean
- {
- var _loc1_:int = 0;
- if(afterLast)
- {
- return false;
- }
- _loc1_ = !!beforeFirst ? 0 : int(currentIndex + 1);
- if(_loc1_ >= view.length)
- {
- _loc1_ = int(AFTER_LAST_INDEX);
- setCurrent(null);
- }
- else
- {
- setCurrent(ListCollectionView(view).getItemAt(_loc1_));
- }
- currentIndex = _loc1_;
- return !afterLast;
- }
-
- public function findLast(param1:Object) : Boolean
- {
- var lcView:ListCollectionView = null;
- var index:int = 0;
- var values:Object = param1;
- checkValid();
- lcView = ListCollectionView(view);
- try
- {
- index = lcView.mx_internal::findItem(values,Sort.LAST_INDEX_MODE);
- }
- catch(sortError:SortError)
- {
- throw new CursorError(sortError.message);
- }
- if(index > -1)
- {
- currentIndex = index;
- setCurrent(lcView.getItemAt(currentIndex));
- }
- return index > -1;
- }
-
- public function seek(param1:CursorBookmark, param2:int = 0, param3:int = 0) : void
- {
- var newIndex:int = 0;
- var newCurrent:Object = null;
- var bookmark:CursorBookmark = param1;
- var offset:int = param2;
- var prefetch:int = param3;
- checkValid();
- if(view.length == 0)
- {
- currentIndex = AFTER_LAST_INDEX;
- setCurrent(null,false);
- return;
- }
- newIndex = int(currentIndex);
- if(bookmark == CursorBookmark.FIRST)
- {
- newIndex = 0;
- }
- else if(bookmark == CursorBookmark.LAST)
- {
- newIndex = view.length - 1;
- }
- else if(bookmark != CursorBookmark.CURRENT)
- {
- try
- {
- newIndex = ListCollectionView(view).mx_internal::getBookmarkIndex(bookmark);
- if(newIndex < 0)
- {
- setCurrent(null);
- throw new CursorError(resourceBookmarkInvalid);
- }
- }
- catch(bmError:CollectionViewError)
- {
- throw new CursorError(resourceInvalidBookmark);
- }
- }
- newIndex += offset;
- newCurrent = null;
- if(newIndex >= view.length)
- {
- currentIndex = AFTER_LAST_INDEX;
- }
- else if(newIndex < 0)
- {
- currentIndex = BEFORE_FIRST_INDEX;
- }
- else
- {
- newCurrent = ListCollectionView(view).getItemAt(newIndex,prefetch);
- currentIndex = newIndex;
- }
- setCurrent(newCurrent);
- }
-
- public function findAny(param1:Object) : Boolean
- {
- var lcView:ListCollectionView = null;
- var index:int = 0;
- var values:Object = param1;
- checkValid();
- lcView = ListCollectionView(view);
- try
- {
- index = lcView.mx_internal::findItem(values,Sort.ANY_INDEX_MODE);
- }
- catch(e:SortError)
- {
- throw new CursorError(e.message);
- }
- if(index > -1)
- {
- currentIndex = index;
- setCurrent(lcView.getItemAt(currentIndex));
- }
- return index > -1;
- }
- }
-